{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 示例：自定义实验配置及回调机制\n",
    "本示例在故障诊断示例基础上增加自定义配置功能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "\n",
    "from fastphm.data import Dataset\n",
    "from fastphm.data.FeatureExtractor import FeatureExtractor\n",
    "from fastphm.data.labeler.BearingFaultLabeler import BearingFaultLabeler\n",
    "from fastphm.data.loader.bearing.XJTULoader import XJTULoader\n",
    "from fastphm.data.processor.RMSProcessor import RMSProcessor\n",
    "from fastphm.entity.Bearing import Fault\n",
    "from fastphm.metric.Evaluator import Evaluator\n",
    "from fastphm.metric.end2end.Accuracy import Accuracy\n",
    "from fastphm.metric.end2end.WeightedF1Score import WeightedF1Score\n",
    "from fastphm.data.stage.BearingStageCalculator import BearingStageCalculator\n",
    "from fastphm.data.stage.fpt.ThreeSigmaFPTCalculator import ThreeSigmaFPTCalculator\n",
    "from fastphm.model.pytorch.base.BaseTester import BaseTester\n",
    "from fastphm.model.pytorch.base.BaseTrainer import BaseTrainer\n",
    "from fastphm.model.pytorch.basic.CNN import CNN\n",
    "from fastphm.util.Plotter import Plotter\n",
    "from fastphm.model.pytorch.callback.CheckGradientsCallback import CheckGradientsCallback\n",
    "from fastphm.model.pytorch.callback.EarlyStoppingCallback import EarlyStoppingCallback\n",
    "from fastphm.model.pytorch.callback.TensorBoardCallback import TensorBoardCallback"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 定义 数据加载器、特征提取器、fpt计算器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[DEBUG   15:11:23]  \n",
      "[DataLoader]  Root directory: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\n",
      "\t✓ Bearing1_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_1\n",
      "\t✓ Bearing1_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_2\n",
      "\t✓ Bearing1_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_3\n",
      "\t✓ Bearing1_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_4\n",
      "\t✓ Bearing1_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_5\n",
      "\t✓ Bearing2_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_1\n",
      "\t✓ Bearing2_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_2\n",
      "\t✓ Bearing2_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_3\n",
      "\t✓ Bearing2_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_4\n",
      "\t✓ Bearing2_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_5\n",
      "\t✓ Bearing3_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_1\n",
      "\t✓ Bearing3_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_2\n",
      "\t✓ Bearing3_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_3\n",
      "\t✓ Bearing3_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_4\n",
      "\t✓ Bearing3_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_5\n"
     ]
    }
   ],
   "source": [
    "data_loader = XJTULoader('D:\\\\data\\\\dataset\\\\XJTU-SY_Bearing_Datasets')\n",
    "feature_extractor = FeatureExtractor(RMSProcessor(data_loader.continuum))\n",
    "fpt_calculator = ThreeSigmaFPTCalculator()\n",
    "stage_calculator = BearingStageCalculator(data_loader.continuum, fpt_calculator)\n",
    "Plotter.DPI = 80"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 构造数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    15:11:23]  [DataLoader]  -> Loading data entity: Bearing1_1\n",
      "[INFO    15:11:25]  [DataLoader]  ✓ Successfully loaded: Bearing1_1\n",
      "[INFO    15:11:25]  [DataLoader]  -> Loading data entity: Bearing1_2\n",
      "[INFO    15:11:29]  [DataLoader]  ✓ Successfully loaded: Bearing1_2\n",
      "[INFO    15:11:29]  [DataLoader]  -> Loading data entity: Bearing1_4\n",
      "[INFO    15:11:31]  [DataLoader]  ✓ Successfully loaded: Bearing1_4\n",
      "[INFO    15:11:31]  [DataLoader]  -> Loading data entity: Bearing2_1\n",
      "[INFO    15:11:40]  [DataLoader]  ✓ Successfully loaded: Bearing2_1\n",
      "[INFO    15:11:40]  [DataLoader]  -> Loading data entity: Bearing2_3\n",
      "[INFO    15:11:51]  [DataLoader]  ✓ Successfully loaded: Bearing2_3\n"
     ]
    }
   ],
   "source": [
    "fault_types = [Fault.NC, Fault.OF, Fault.IF, Fault.CF]\n",
    "labeler = BearingFaultLabeler(2048, fault_types, is_multi_hot=False)\n",
    "dataset = Dataset()\n",
    "for bearing_name in ['Bearing1_1', 'Bearing1_2', 'Bearing1_4', 'Bearing2_1', 'Bearing2_3']:\n",
    "    bearing = data_loader(bearing_name, 'Horizontal Vibration')\n",
    "    feature_extractor(bearing)\n",
    "    stage_calculator(bearing)\n",
    "    dataset.add(labeler(bearing))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 划分数据集：训练集（70%）、验证集（15%）、测试集（15%）\n",
    "- 训练集：用于模型参数学习\n",
    "- 验证集：用于模型调参、早停（early stopping）、选择最佳模型\n",
    "- 测试集：只用于最终性能评估，不参与任何训练和调参过程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "train_set, test_set = dataset.split_by_ratio(0.7)\n",
    "val_set, test_set = test_set.split_by_ratio(0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 配置测试算法\n",
    "因为没有什么可设置的参数，其实可以使用默认配置。这里使用自定义配置仅为示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_config = {\n",
    "    'device': torch.device('cuda' if torch.cuda.is_available() else 'cpu'),\n",
    "    'dtype': torch.float32,\n",
    "}\n",
    "tester = BaseTester(test_config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 自定义配置训练算法&早停、tensorboard、梯度检测回调\n",
    "- EarlyStoppingCallback，早停回调，耐心10，使用准确率指标选取最佳模型\n",
    "- TensorBoardCallback，自动将模型参数保存至tensorboard，文件保存至runs文件夹下\n",
    "- CheckGradientsCallback，检查模型梯度，当过大（梯度爆炸），过小（梯度消失）时日志记录警告信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_config = {\n",
    "    'device': torch.device('cuda' if torch.cuda.is_available() else 'cpu'),\n",
    "    'dtype': torch.float32,\n",
    "    'epochs': 100,\n",
    "    'batch_size': 128,\n",
    "    'lr': 0.01,\n",
    "    'weight_decay': 0.0,\n",
    "    'criterion': nn.CrossEntropyLoss(),\n",
    "    'callbacks': [\n",
    "        EarlyStoppingCallback(patience=10,\n",
    "                              val_set=val_set,\n",
    "                              metric=Accuracy(),\n",
    "                              tester=tester),\n",
    "        TensorBoardCallback(),\n",
    "        CheckGradientsCallback()\n",
    "    ]\n",
    "}\n",
    "trainer = BaseTrainer(train_config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 定义模型并训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    15:11:51]  \n",
      "[Trainer]  Start training by BaseTrainer:\n",
      "\ttraining set: Bearing1_1; Bearing1_2; Bearing1_4;…\n",
      "\tdevice: cuda\n",
      "\tdtype: torch.float32\n",
      "\tepochs: 100\n",
      "\tbatch_size: 128\n",
      "\tlr: 0.01\n",
      "\tweight_decay: 0.0\n",
      "\tcriterion: CrossEntropyLoss()\n",
      "\tcallbacks: [EarlyStoppingCallback, TensorBoardCallback, CheckGradientsCallback]\n",
      "\toptimizer: Adam\n",
      "[DEBUG   15:11:52]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.1618\n",
      "[INFO    15:11:52]  [BaseTrainer]  Epoch [1/100], CrossEntropyLoss:0.2765\n",
      "[DEBUG   15:11:52]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9542\n",
      "[WARNING 15:11:52]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 0.00e+00\n",
      "[WARNING 15:11:52]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 0.00e+00\n",
      "[WARNING 15:11:52]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 0.00e+00\n",
      "[INFO    15:11:53]  [BaseTrainer]  Epoch [2/100], CrossEntropyLoss:0.0918\n",
      "[DEBUG   15:11:53]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9598\n",
      "[WARNING 15:11:53]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 1.44e-08\n",
      "[WARNING 15:11:53]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 5.99e-08\n",
      "[WARNING 15:11:53]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 2.43e-10\n",
      "[WARNING 15:11:53]  [CheckGradients]  fc1.weight gradient is very small: 9.22e-06\n",
      "[INFO    15:11:53]  [BaseTrainer]  Epoch [3/100], CrossEntropyLoss:0.0761\n",
      "[DEBUG   15:11:53]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9878\n",
      "[WARNING 15:11:53]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 5.29e-07\n",
      "[WARNING 15:11:53]  [CheckGradients]  fc1.weight gradient is very small: 4.36e-06\n",
      "[INFO    15:11:54]  [BaseTrainer]  Epoch [4/100], CrossEntropyLoss:0.0534\n",
      "[DEBUG   15:11:54]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9913\n",
      "[WARNING 15:11:54]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 7.94e-08\n",
      "[WARNING 15:11:54]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 2.07e-07\n",
      "[WARNING 15:11:54]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 1.27e-09\n",
      "[WARNING 15:11:54]  [CheckGradients]  fc1.weight gradient is very small: 2.96e-06\n",
      "[INFO    15:11:54]  [BaseTrainer]  Epoch [5/100], CrossEntropyLoss:0.0341\n",
      "[DEBUG   15:11:54]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9921\n",
      "[WARNING 15:11:54]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 3.03e-08\n",
      "[WARNING 15:11:54]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 8.01e-08\n",
      "[WARNING 15:11:54]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 3.41e-10\n",
      "[WARNING 15:11:54]  [CheckGradients]  fc1.weight gradient is very small: 7.05e-06\n",
      "[INFO    15:11:54]  [BaseTrainer]  Epoch [6/100], CrossEntropyLoss:0.0459\n",
      "[DEBUG   15:11:55]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9851\n",
      "[DEBUG   15:11:55]  [EarlyStopping]  No improvement for [1/10] epochs\n",
      "[WARNING 15:11:55]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 2.07e-07\n",
      "[WARNING 15:11:55]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 5.19e-07\n",
      "[WARNING 15:11:55]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 1.02e-08\n",
      "[WARNING 15:11:55]  [CheckGradients]  conv3.weight gradient is very small: 3.26e-06\n",
      "[WARNING 15:11:55]  [CheckGradients]  se3.excitation.0.weight gradient is very small: 5.45e-06\n",
      "[WARNING 15:11:55]  [CheckGradients]  fc1.weight gradient is very small: 3.95e-07\n",
      "[INFO    15:11:55]  [BaseTrainer]  Epoch [7/100], CrossEntropyLoss:0.0375\n",
      "[DEBUG   15:11:55]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9936\n",
      "[WARNING 15:11:55]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 4.31e-08\n",
      "[WARNING 15:11:55]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 9.18e-08\n",
      "[WARNING 15:11:55]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 7.84e-10\n",
      "[INFO    15:11:55]  [BaseTrainer]  Epoch [8/100], CrossEntropyLoss:0.0214\n",
      "[DEBUG   15:11:55]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9930\n",
      "[DEBUG   15:11:55]  [EarlyStopping]  No improvement for [1/10] epochs\n",
      "[WARNING 15:11:56]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 2.82e-06\n",
      "[INFO    15:11:56]  [BaseTrainer]  Epoch [9/100], CrossEntropyLoss:0.0811\n",
      "[DEBUG   15:11:56]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9720\n",
      "[DEBUG   15:11:56]  [EarlyStopping]  No improvement for [2/10] epochs\n",
      "[WARNING 15:11:56]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 8.77e-06\n",
      "[WARNING 15:11:56]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 6.58e-06\n",
      "[WARNING 15:11:56]  [CheckGradients]  se2.excitation.2.bias gradient is very small: 2.13e-06\n",
      "[WARNING 15:11:56]  [CheckGradients]  conv3.weight gradient is very small: 2.74e-06\n",
      "[WARNING 15:11:56]  [CheckGradients]  se3.excitation.0.weight gradient is very small: 3.92e-06\n",
      "[WARNING 15:11:56]  [CheckGradients]  fc1.weight gradient is very small: 6.10e-07\n",
      "[INFO    15:11:56]  [BaseTrainer]  Epoch [10/100], CrossEntropyLoss:0.0980\n",
      "[DEBUG   15:11:56]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9738\n",
      "[DEBUG   15:11:56]  [EarlyStopping]  No improvement for [3/10] epochs\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 4.60e-07\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 2.73e-07\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 4.25e-07\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.2.bias gradient is very small: 5.60e-08\n",
      "[WARNING 15:11:57]  [CheckGradients]  conv3.weight gradient is very small: 7.33e-07\n",
      "[WARNING 15:11:57]  [CheckGradients]  fc1.weight gradient is very small: 3.33e-06\n",
      "[INFO    15:11:57]  [BaseTrainer]  Epoch [11/100], CrossEntropyLoss:0.0597\n",
      "[DEBUG   15:11:57]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9837\n",
      "[DEBUG   15:11:57]  [EarlyStopping]  No improvement for [4/10] epochs\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 5.17e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 2.48e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.2.bias gradient is very small: 8.17e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  fc1.weight gradient is very small: 6.11e-07\n",
      "[INFO    15:11:57]  [BaseTrainer]  Epoch [12/100], CrossEntropyLoss:0.0329\n",
      "[DEBUG   15:11:57]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9898\n",
      "[DEBUG   15:11:57]  [EarlyStopping]  No improvement for [5/10] epochs\n",
      "[WARNING 15:11:57]  [CheckGradients]  conv2.weight gradient is very small: 4.35e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 2.85e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 4.66e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 6.40e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  se2.excitation.2.bias gradient is very small: 2.35e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  conv3.weight gradient is very small: 1.92e-06\n",
      "[WARNING 15:11:57]  [CheckGradients]  fc1.weight gradient is very small: 8.07e-08\n",
      "[WARNING 15:11:57]  [CheckGradients]  fc1.bias gradient is very small: 1.38e-06\n",
      "[INFO    15:11:58]  [BaseTrainer]  Epoch [13/100], CrossEntropyLoss:0.0270\n",
      "[DEBUG   15:11:58]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9898\n",
      "[DEBUG   15:11:58]  [EarlyStopping]  No improvement for [6/10] epochs\n",
      "[WARNING 15:11:58]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 7.07e-06\n",
      "[WARNING 15:11:58]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 7.41e-06\n",
      "[WARNING 15:11:58]  [CheckGradients]  se2.excitation.2.bias gradient is very small: 1.17e-06\n",
      "[WARNING 15:11:58]  [CheckGradients]  fc1.weight gradient is very small: 3.71e-07\n",
      "[INFO    15:11:58]  [BaseTrainer]  Epoch [14/100], CrossEntropyLoss:0.0216\n",
      "[DEBUG   15:11:58]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9913\n",
      "[DEBUG   15:11:58]  [EarlyStopping]  No improvement for [7/10] epochs\n",
      "[WARNING 15:11:58]  [CheckGradients]  se2.excitation.2.bias gradient is very small: 2.66e-06\n",
      "[WARNING 15:11:58]  [CheckGradients]  fc1.weight gradient is very small: 3.94e-06\n",
      "[INFO    15:11:59]  [BaseTrainer]  Epoch [15/100], CrossEntropyLoss:0.0178\n",
      "[DEBUG   15:11:59]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9915\n",
      "[DEBUG   15:11:59]  [EarlyStopping]  No improvement for [8/10] epochs\n",
      "[WARNING 15:11:59]  [CheckGradients]  conv2.weight gradient is very small: 3.79e-06\n",
      "[WARNING 15:11:59]  [CheckGradients]  se2.excitation.0.weight gradient is very small: 4.15e-06\n",
      "[WARNING 15:11:59]  [CheckGradients]  se2.excitation.0.bias gradient is very small: 5.49e-06\n",
      "[WARNING 15:11:59]  [CheckGradients]  se2.excitation.2.weight gradient is very small: 3.10e-06\n",
      "[WARNING 15:11:59]  [CheckGradients]  se2.excitation.2.bias gradient is very small: 8.96e-07\n",
      "[WARNING 15:11:59]  [CheckGradients]  conv3.weight gradient is very small: 1.00e-06\n",
      "[WARNING 15:11:59]  [CheckGradients]  fc1.weight gradient is very small: 5.96e-08\n",
      "[WARNING 15:11:59]  [CheckGradients]  fc1.bias gradient is very small: 1.36e-06\n",
      "[INFO    15:11:59]  [BaseTrainer]  Epoch [16/100], CrossEntropyLoss:0.0227\n",
      "[DEBUG   15:11:59]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9927\n",
      "[DEBUG   15:11:59]  [EarlyStopping]  No improvement for [9/10] epochs\n",
      "[WARNING 15:11:59]  [CheckGradients]  fc1.weight gradient is very small: 1.78e-06\n",
      "[INFO    15:12:00]  [BaseTrainer]  Epoch [17/100], CrossEntropyLoss:0.0289\n",
      "[DEBUG   15:12:00]  [EarlyStopping]  On the validation set Bearing1_1; Bearing1_2; Bearing1_4; Bearing2_1; Bearing2_3, the Accuracy is 0.9889\n",
      "[DEBUG   15:12:00]  [EarlyStopping]  No improvement for [10/10] epochs\n",
      "[WARNING 15:12:00]  [BaseTrainer]  End early after epoch\n"
     ]
    }
   ],
   "source": [
    "model = CNN(2048, len(fault_types))\n",
    "losses = trainer.train(model, train_set)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x280 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Plotter.loss(losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "result = tester.test(model, test_set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 预测结果评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x280 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Plotter.confusion_matrix(test_set, result, types=fault_types)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    15:12:00]  \n",
      "[Evaluator]  Performance Evaluation:\n",
      "             Accuracy WeightedF1Score\n",
      "Bearing1_1     0.9831          0.9831\n",
      "Bearing1_2     0.9922          0.9923\n",
      "Bearing1_4     0.9829          0.9791\n",
      "Bearing2_1     0.9992          0.9991\n",
      "Bearing2_3     0.9969          0.9969\n",
      "mean(global)   0.9948          0.9947\n",
      "mean(group)    0.9948          0.9944\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>WeightedF1Score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Bearing1_1</th>\n",
       "      <td>0.9831</td>\n",
       "      <td>0.9831</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bearing1_2</th>\n",
       "      <td>0.9922</td>\n",
       "      <td>0.9923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bearing1_4</th>\n",
       "      <td>0.9829</td>\n",
       "      <td>0.9791</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bearing2_1</th>\n",
       "      <td>0.9992</td>\n",
       "      <td>0.9991</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bearing2_3</th>\n",
       "      <td>0.9969</td>\n",
       "      <td>0.9969</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean(global)</th>\n",
       "      <td>0.9948</td>\n",
       "      <td>0.9947</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean(group)</th>\n",
       "      <td>0.9948</td>\n",
       "      <td>0.9944</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             Accuracy WeightedF1Score\n",
       "Bearing1_1     0.9831          0.9831\n",
       "Bearing1_2     0.9922          0.9923\n",
       "Bearing1_4     0.9829          0.9791\n",
       "Bearing2_1     0.9992          0.9991\n",
       "Bearing2_3     0.9969          0.9969\n",
       "mean(global)   0.9948          0.9947\n",
       "mean(group)    0.9948          0.9944"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluator = Evaluator()\n",
    "evaluator.add(Accuracy(), WeightedF1Score())\n",
    "evaluator(test_set, result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
